/**
 * 
 */
package com.mbengue.corp.apr.ra.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import com.mbengue.corp.apr.ra.core.Adresse;
import com.mbengue.corp.apr.ra.core.AdresseMembre;
import com.mbengue.corp.apr.ra.core.AdresseMembreId;
import com.mbengue.corp.apr.ra.core.Membre;
import com.mbengue.corp.apr.ra.dao.AdresseDao;
import com.mbengue.corp.apr.ra.dao.DAOFactory;
import com.mbengue.corp.apr.ra.dao.MembreDao;

/**
 * @author MMB11447
 *
 */
@ManagedBean(name = "membreBean")
@SessionScoped
public class MembreBean implements Serializable {
  private static final long serialVersionUID = 1L;
  private static final String[] ROLES = { "Simple", "Editeur", "Administrateur" };
  private static final String[] DB_ROLES = { "r", "w", "x" };
  private String verifEmail;
  private String verifPwd;
  private Membre membre;
  private Adresse adresse;
  private MembreDao membreDao;
  private AdresseDao adresseDao;
  private List<SelectItem> roles = new ArrayList<SelectItem>();

  public MembreBean() {
    membre = new Membre();
    adresse = new Adresse();
    membreDao = DAOFactory.getMembreDao();
    adresseDao = DAOFactory.getAdresseDao();
    //
    for (int i = 0; i < ROLES.length; i++) {
      roles.add(new SelectItem(DB_ROLES[i], ROLES[i]));
    }
  }

  public String getVerifEmail() {
    return verifEmail;
  }

  public void setVerifEmail(String aVerifEmail) {
    verifEmail = aVerifEmail;
  }

  public String getVerifPwd() {
    return verifPwd;
  }

  public void setVerifPwd(String aVerifPwd) {
    verifPwd = aVerifPwd;
  }

  /**
   * @return the membre
   */
  public Membre getMembre() {
    return membre;
  }

  /**
   * @param membre the membre to set
   */
  public void setMembre(Membre membre) {
    this.membre = membre;
  }

  public Adresse getAdresse() {
    return adresse;
  }

  public void setAdresse(Adresse aAdresse) {
    adresse = aAdresse;
  }

  public List<SelectItem> getRoles() {
    return roles;
  }

  public String enregistrer() {
    if (!checkData()) {
      return "#";
    }
    try {
      adresseDao.ajouter(adresse);
      membreDao.ajouterMembre(membre);
      AdresseMembreId idAM = new AdresseMembreId(membre.getEmail(), adresse.getId());
      AdresseMembre adMembre = new AdresseMembre(idAM, adresse, membre);
      DAOFactory.getAdresseMembreDao().ajouter(adMembre);
      FacesContext.getCurrentInstance().addMessage(null,
          new FacesMessage(FacesMessage.SEVERITY_INFO, "", "Membre enregistré avec succés!"));
      return "/pages/contacts.xhtml?faces-redirect=true";
    } catch (Exception e) {
      FacesContext.getCurrentInstance().addMessage(null,
          new FacesMessage(FacesMessage.SEVERITY_ERROR, "Un erreur est survenu. Echec de l'operation!", ""));
      return null;
    } finally {
      membre = new Membre();
      adresse = new Adresse();
      verifEmail = "";
      verifPwd = "";
    }
  }

  public List<Membre> getMembres() {
    return membreDao.tousLesMembres();
  }

  private boolean checkData() {
    if (checkMembreData()) {
      return checkAdresseData();
    }
    return false;
  }

  private boolean checkMembreData() {
    boolean isOK = true;
    if (membre.getNom().isEmpty() || membre.getPrenom().isEmpty() || membre.getTelephone().isEmpty()
        || membre.getMotDePasse().isEmpty() || membre.getRole().isEmpty() || membre.getFonction().isEmpty()
        || membre.getDateDeNaissance() == null) {
      FacesContext.getCurrentInstance().addMessage(null,
          new FacesMessage(FacesMessage.SEVERITY_ERROR, "Tous les champs sont obligatoires.", ""));
      isOK = false;
    }
    if (isOK) {
      if (!membre.getEmail().equals(verifEmail)) {
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, "L'email et sa confirmation doivent être les mêmes !", ""));
        isOK = false;
      }
    }
    if (isOK) {
      if (!membre.getMotDePasse().equals(verifPwd)) {
        FacesContext.getCurrentInstance().addMessage(
            null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Le mot de passe et sa confirmation doivent être les mêmes !", ""));
        isOK = false;
      }
    }
    return isOK;
  }

  private boolean checkAdresseData() {
    boolean isOK = true;
    if (adresse.getAdresse().isEmpty() || adresse.getCodePostal().isEmpty() || adresse.getPays().isEmpty()
        || adresse.getVille().isEmpty()) {
      FacesContext.getCurrentInstance().addMessage(null,
          new FacesMessage(FacesMessage.SEVERITY_ERROR, "Tous les champs sont obligatoires.", ""));
      isOK = false;
    }
    if (adresse.getCodePostal().length() != 5) {
      FacesContext.getCurrentInstance().addMessage(null,
          new FacesMessage(FacesMessage.SEVERITY_ERROR, "Le code postal doit contenir 5 chiffres !", ""));
      isOK = false;
    } else {
      try {
        Integer.parseInt(adresse.getCodePostal());
      } catch (NumberFormatException nfe) {
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(FacesMessage.SEVERITY_ERROR, "Le code postal doit contenir que des chiffres (5).", ""));
        isOK = false;
      }
    }
    return isOK;
  }
}
